Objective-C中.h、.m、.mm的区别
.h :头文件。头文件包含类,类型,函数和常数的声明。
.m :源代码文件。这是典型的源代码文件扩展名,可以包含Objective-C和C代码。
.mm :源代码文件。带有这种扩展名的源代码文件,除了可以包含Objective-C和C代码以外还可以包含C++代码。仅在你的Objective-C代码中确实需要使用C++类或者特性的时候才用这种扩展名
当你需要在源代码中包含头文件的时候,你可以使用标准的#include编译选项,但是Objective-C提供了更好的方法。#import选项和#include选项完全相同,只是它可以确保相同的文件只会被包含一次。Objective-C的例子和文档都倾向于使用#import。
nil:指向oc中对象的空指针
Nil:指向oc中类的空指针
NULL:指向其他类型的空指针,如一个c类型的内存指针
NSNull:在集合对象中,表示空值的对象
若obj为nil:
[obj message]将返回NO,而不是NSException
若obj为NSNull:
[obj message]将抛出异常NSException
OC像iphone手机一样与众不同,虽然有很多优秀的地方,对于刚接触的人还是有很多不适应。自己做iphone开发不久,之前对@property使用有很多不解,现在把自己理解的做下小结:
一、@property 是什么?
简单点说,属性就是一种支持访问对象成员变更的快捷的方法,可以自动的生成setter和getter方法(setter只支持传一个参数)。
面向对象思想的基本特点为封装、继承、多态。封装性主要体现在无法直接访问对象成员变量,如果需要的话,通过setter和getter方法访问成员变量。这样的话,通常要为每一个支持外边访问的成员变量写两个方法,这种操作比较繁琐且无意义。通过@property可以简化这种方法。
声明:属性要在头文件中声明,声明格式为: @property (attributes) type propertyName;
实现(合成):实现要在.m文件中,格式为 @synthesize name = _name; 而在xcode4.4以后的版本,系统会自动合成, 等价于自己写了代码“ @synthesize name = _name;” 。 也就是说如果没有特殊需求,只需要在头文件中声明而无需实现,就可以直接使用了。
成员变量访问权限:头文件中声明的成员变量,默认是protected,.m文件中声明的成员变量,默认是private的。合成属性时,@synthesize propertyName = _name;如果变量_name没有声明,系统会自动生成该成员变量且为private权限。如果_name已声明,它们会自动合成。
ClassA.h
ClassA.m
二、使用
声明一个属性,如果没有声明为只读的,它默认会生成两个方法 - (type)name 和 - (void)setName; 为了可读性等其它原因,也可以改变属性的setter和getter访问名称,
@property (setter=setMyValue, getter=getBool) NSInteger value;
这样的话就可以通过 [obj setMyValue:10] 和 [obj getBool]方法业访问成员变量了,此时setValue方法会被覆盖,不再存在。
三、@property的修饰属性(attributes )
可读性:readwrite / readonly ,不写的话默认为readwrite,即会合成setter和getter方法。
原子性:nonatomic / 【默认】,系统默认setter和getter为原子操作(没有atomic关键字),如果想设置为非原子操作,可以nonatomic。
内存 assign / retain / weak / strong ,在非ARC环境下, assign为默认,引用计数不变;retain引用计数加1;在引用计数环境下,默认为strong,与retain作用相同;从5.0系统后引入了weak,作用与assign相似,不过当所指向对象引用为0时,自动置为nil。
Object-c基础之三:面对对象开发@interface,@implementation
1.@interface
在Java等语言编程中,创建类都是用class,但在object-c中,用@interface。
例子:
@interface circle :NSObject //定义名为circle的类,继承自NSObject
{
ShapeColorfillColor;//定义ShapeColor类型的实例变量 fillColor;
Shapebounds;//定义Shape类型的实例变量 bounds;
}
- (void)setFillColor:(ShapeColor)fillColor;//定义名为setFillColor的方法
2.@implementation
在object-c中,@interface定义放在.h文件中,而@implementation放在.m 文件,是.h文件的详细实现。
例子:
@implementation circle //结尾没有分号。
- (void)setFillColor:(ShapeColor)c
{
fillColor= c;//把参数c赋值给@interface中定义的fillColor;
}
3.实例化对象
为了使用我们已经定义的类,我们需要实例化对象,我们可以在我们创建的文件中的main()函数实例化:如下
int main(int argc, const char * argv[])
{
idshapes[3];//定义id类型数组
shapes[0]= [circle new];//实例化circle并赋值给shapes
[shapes[0]setFillColor:kRedColor];//调用方法进行赋值
}
iOS 【UIKit-UIImage渲染模式 imageWithRenderingMode:】
设置UIImage的渲染模式:UIImage.renderingMode
着色(Tint Color)是iOS7界面中的一个设置UIImage的渲染模式,你可以设置一个UIImage在渲染时是否使用当前视图的Tint Color。UIImage新增了一个只读属性:renderingMode,对应的还有一个新增方法:imageWithRenderingMode:,它使用UIImageRenderingMode枚举值来设置图片的renderingMode属性。该枚举中包含下列值:
- UIImageRenderingModeAutomatic // 根据图片的使用环境和所处的绘图上下文自动调整渲染模式。
-
UIImageRenderingModeAlwaysOriginal // 始终绘制图片原始状态,不使用Tint Color。
- UIImageRenderingModeAlwaysTemplate // 始终根据Tint Color绘制图片,忽略图片的颜色信息。
比如说我们设置这么一句话:
childVc.tabBarItem.selectedImage = [[UIImage imageNamed:selectImage] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
设置与不设置的区别:
设置时:
未设置时:
我们发现图片的原始状态是橙色,设置渲染时始终绘制图片的原始状态就是上面的效果了。而下面蓝色的效果是apple原来就有的。
[IOS] 图片显示 imageNamed, initWithContentsOfFile 的区别
1.用imageNamed方法
[UIImage imageNamed:ImageName];
此方法为常见方法,利用它可以方便加载资源图片。用imageNamed的方式加载时,会把图像数据根据它的名字缓存在系统内存中,以提高imageNamed方法获得相同图片的image对象的性能。即使生成的对象被 autoReleasePool释放了,这份缓存也不释放。而且没有明确的释放方法。如果图像比较大,或者图像比较多,用这种方式会消耗很大的内存。
2.用 imageWithContentsOfFile 方法
NSString *thumbnailFile = [NSString stringWithFormat:@"%@/%@.png", [[NSBundle mainBundle] resourcePath], fileName]; UIImage *thumbnail = [UIImage imageWithContentsOfFile:thumbnailFile];
此方法加载的图片是不会缓存的。得到的对象时autoRelease的,当autoReleasePool释放时才释放。
3. 用initWithContentsFile方法
UIImage *image = [[UIImage alloc] initWithContentsOfFile:filePath]
此方法要手动release掉。不系统缓存。release后立即释放,一般用在封面等图比较大的地方。
UITableView NSIndexPath属性讲解
NSIndexPath的创建
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
-(void)cellImageDidLoad:(NSIndexPath *)indexPath image:(UIImage *)image
{
UITableViewCell *cell = [wqTablecellForRowAtIndexPath:indexPath];
cell.imageView.image = image;
}
@UISegmentedControl类似于UIButton,它可以提供多个选择操作,响应事件,但具有很大的局限性,我们更多的是使用自定义的,不过在这里还是介绍下它的基本用法.