OK, I found in the code sample from Apple, man use the NSAssert3, so I think I really need to google the meaning of NSAssertX, because somewhere man use NSAssert1, somewhere man use the NSAssert3, or others, So I find the explain for that from the page:http://gnu.ethz.ch/debian/gnustep-base/gnustep-base-1.19.3/Documentation/manual/manual_6.html
I copy part of page for backup, the copyright belong to the original author!

6.3.1 Assertions and their Handling

Assertions allow the developer to establish that certain conditions hold before undertaking an operation. In GNUstep, the standard means to make an assertion is to use one of a collection of NSAssert macros. The general form of these macros is:

NSAssert(, , );

For instance:

NSAssert1(x == 10, "X should have been 10, but it was %d.", x);

If the test ’x == 10’ evaluates to true, NSLog() is called with information on the method and line number of the failure, together with the format string and argument. The resulting console message will look like this:

Foo.m:126  Assertion failed in Foo(instance), method Bar.  X should have been
10, but it was 5.

After this is logged, an exception is raised of type ’NSInternalInconsistencyException’, with this string as its description.

In order to provide the method and line number information, the NSAssert() routine must be implemented as a macro, and therefore to handle different numbers of arguments to the format string, there are 5 assertion macros for methods: NSAssert(condition, description), NSAssert1(condition, format, arg1), NSAssert2(condition, format, arg1, arg2), …, NSAssert5(…).

If you need to make an assertion inside a regular C function (not an Objective-C method), use the equivalent macros NSCAssert(), etc..

Note, you can completely disable assertions (saving the time for the boolean test and avoiding the exception if fails) by putting #define NS_BLOCK_ASSERTIONS before you include NSException.h.

OK, So I am clear what is that and how to use that!